/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package fi.uba.algo3.tp3.modelo.actores;

import fi.uba.algo3.tp3.modelo.inanimados.Comible;
import fi.uba.algo3.tp3.modelo.inanimados.Obstaculo;
import fi.uba.algo3.tp3.modelo.notificaciones.StateNotification;
import fi.uba.algo3.tp3.modelo.servicios.ServicioJuego;
import fi.uba.algo3.tp3.modelo.servicios.exceptions.VidasNoSuficientesException;
import fi.uba.algo3.tp3.modelo.actores.exceptions.*;

/**
 *
 * @author ariel
 */
public class Pacman extends Personaje {

    public Pacman(ServicioJuego servicio,Integer distanciaDeColision) {
        super(servicio,distanciaDeColision);
        super.cambiarSentidoAHorizontalIzquierda();
    }
    
    @Override
    protected void vivir(ServicioJuego servicio) {
        // El movimiento depende de la accion del usuario.
        x += sentidoX;
        y += sentidoY;
        Comible comible = servicio.obtenerComibleMasCercano(this, distanciaDeColision.doubleValue());;
        Obstaculo obstaculo =  servicio.obtenerObstaculoMasCercano(this, distanciaDeColision.doubleValue());
        if(obstaculo!=null) {
            //Vuelvo al estado previo (el válido)
            x -= sentidoX;
            y -= sentidoY;
            //queda quieto hasta que se presione otro comando
            sentidoX = 0;
            sentidoY = 0;
        }
        if(comible!=null){
            comible.serComido();
        }
    }

    private void notificar(StateNotification bean) {
        if(observer!=null)
            observer.notificar(bean);
    }

    //En el pacman estos deben ser public porque se acceden desde afuera
    @Override
    public void cambiarSentidoAHorizontalDerecha(){
        super.cambiarSentidoAHorizontalDerecha();
        notificar(StateNotification.DERECHA);
    }

    @Override
    public void cambiarSentidoAHorizontalIzquierda(){
        super.cambiarSentidoAHorizontalIzquierda();
        notificar(StateNotification.IZQUIERDA);
    }

    @Override
    public void cambiarSentidoAVerticalArriba(){
        super.cambiarSentidoAVerticalArriba();
        notificar(StateNotification.ARRIBA);
    }

    @Override
    public void cambiarSentidoAVerticalAbajo(){
        super.cambiarSentidoAVerticalAbajo();
        notificar(StateNotification.ABAJO);
    }

    public void morir(ServicioJuego servicio) throws PuntoDePoderActivoException{
        //if(!servicio.isTiempoPoderOn()){
            try {
                this.x=posicionInicialX;
                this.y=posicionInicialY;
                servicio.decrementarVida();
            } catch (VidasNoSuficientesException ex) {
                System.out.println("PERDIO");
            }
//        }else{
//            throw new PuntoDePoderActivoException();
//        }
    }

    @Override
    public void reestablecer(ServicioJuego servicio) {
        //Ver si le pedimos al servicio que la posicion Inicial
        sentidoX=0;
        sentidoY=0;
        x=posicionInicialX;
        y=posicionInicialY;
        cambiarSentidoAHorizontalIzquierda();
        observer.notificar(StateNotification.NORMAL);
    }


}
